#ifndef __KYO_SDL_H__
#define __KYO_SDL_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_mixer.h>
#include <my_debug.h>

#define SDL_ERRP(con, ret, flag, ...)   ERRP(con, ret, flag, __VA_ARGS__)

#define KYO_BUF_MAX     1024

#define KYO_SDL_QUIT        -1

//按键对应回调函数
typedef int (sdl_key_handle_t)(SDLKey key, Uint32 state, void *);

//SDL程序退出回调函数
typedef void (sdl_quit_handle_t)(void *);

//SDL初始化与创建窗口标志位
#define KYO_VIDEO       0x0
#define KYO_AUDIO       0x1
#define KYO_IMG         0x2
#define KYO_TTF         0x4

//按键数据结构体
typedef struct {
    // int keykey;
    // int state;
    sdl_key_handle_t *handle;
    void *data;
}sdl_key_t;

typedef struct sdl_t {
    Uint32  init_img:1;
    Uint32  init_ttf:1;
    Uint32  init_audio:1;
    Uint32  quit:1;
    SDLKey  old_quit_key;
    sdl_quit_handle_t *quit_handle;
    void *quit_data;
    sdl_key_t key[2][SDLK_LAST];        //保存按键数据
    SDL_Surface *screen;                //窗口标识符
}KYO_SDL;

//SDL库初始化并且创建窗口
KYO_SDL *sdl_init(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flag);
//绑定按键 获取到什么按键执行什么函数
//把按键 按键状态 执行函数 函数参数这些数据保存到二维数组中
//按键状态为二维数组二维下标  按键值为二给数组一维下标
Uint32 sdl_bind_key(KYO_SDL *sdl, SDLKey key, Uint8 state, sdl_key_handle_t *handle, void *data);

//按键取消绑定
Uint32 sdl_unbind_key(KYO_SDL *sdl, SDLKey key, Uint8 state);

//注册退出回调函数
//key 为退出按键 0代表不改变按键
//handle为退出程序自动调用的函数 如果为NULL 则退出不调用任何函数
//data自动调用函数的参数
Uint32 sdl_register_quit(KYO_SDL *sdl, SDLKey key, sdl_quit_handle_t *handle, void *data);


//获取事件  并且执行事件对应的函数
//exit  是否在本函数调用sdl_exit函数
//  !0  调用
//  0   不调用
Uint32 sdl_run(KYO_SDL *, Uint8 exit);


//SDL程序退出回调函数
int sdl_pro_quit(SDLKey key, Uint32 state, void *data);

//SDL库对应所有销毁和释放等操作
void sdl_exit(KYO_SDL **);

void draw_pixel(SDL_Surface *dst, int x, int y, Uint32 color);
void draw_vline(SDL_Surface *dst, int x, int y, int len, Uint32 color);
void draw_hline(SDL_Surface *dst, int x, int y, int len, Uint32 color);
void draw_rect(SDL_Surface *dst, int x, int y, int w, int h, Uint32 color);
void draw_box(SDL_Surface *dst, int x, int y, int w, int h, int border, Uint32 border_color, Uint32 color);
void draw_circle(SDL_Surface *dst, int x, int y, int r, Uint32 color);
;
SDL_Surface *pic_load(const char *file);

#endif /* __KYO_SDL_H__ */
